跳到主要内容

JZ26 二叉搜索树与双向链表

https://www.nowcoder.com/practice/947f6eb80d944a84850b0538bf0ec3a5

import java.util.ArrayList;

/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;

public TreeNode(int val) {
this.val = val;

}

}
*/
public class Solution {
ArrayList<TreeNode> list = new ArrayList<>();

public TreeNode Convert(TreeNode pRootOfTree) {
if (pRootOfTree == null) return null;

traversal(pRootOfTree);
TreeNode root = new TreeNode(0);
TreeNode cur = root;
for (int i = 0; i< list.size(); i++) {
cur.right = list.get(i);
TreeNode temp = cur;
cur = cur.right;
cur.left = temp;
}

root.right.left = null;
return root.right;
}

void traversal(TreeNode node) {
if (node == null) return;

traversal(node.left); // 取得最左边的值
list.add(node);
traversal(node.right);
}
}

第二次:

可以在中序遍历时交换,这样就无需额外空间存储顺序了

/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;

public TreeNode(int val) {
this.val = val;

}

}
*/
public class Solution {
TreeNode pre = null; // 这个算是临时节点
TreeNode head = null; // 这个基本不用动,它只在最开始取得最左边的节点

// 因为是二叉搜索树,所以中序遍历就是排序后的数据
public TreeNode Convert(TreeNode pRootOfTree) {
if (pRootOfTree == null) return null;
ConvertSub(pRootOfTree);
return head;
}
// 采用中序遍历的方式修改指针
private void ConvertSub(TreeNode root) {
if (root == null) return;
ConvertSub(root.left);
if (pre == null) { // 初始化
pre = root;
head = root;
} else {
pre.right = root;
root.left = pre;
pre = root;
}
ConvertSub(root.right);
}
}